/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package trunk.model;


import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.concurrent.Semaphore;
import java.util.logging.Level;
import java.util.logging.Logger;

import trunk.model.calendar.Event;
import trunk.view.TelaServer;

/**
 *
 * @author Karine
 */
public class ProgramServer {
	private ObjectOutputStream output;
	private ObjectInputStream input;
	public ServerSocket servidor;
	public Socket conexao;
	private TelaServer telaServer;
	private int porta;
	private static BancoDeClientes bancoDeClientes = new BancoDeClientes();
	private static BancoDeCompromissos bancoDeCompromissos = new BancoDeCompromissos();
	private File arquivoClientes;
	private File arquivoCompromissos;
	private ObjectInputStream clientesInput;
	private ObjectInputStream compromissosInput;
        private static Integer salas_Chat = new Integer(3);
        private static Integer salas_Video = new Integer(1);
        private static Integer tela_Emoticon = new Integer(1);
        private static ArrayList donos_SalaChat =  new ArrayList() ;
  
	//   Cliente novo;
	public ProgramServer(int porta) {
		telaServer = new TelaServer();
		telaServer.setVisible(true);
		this.porta = porta;
	}

	public void ExecutarServidor() throws ClassNotFoundException {

		try {
			servidor = new ServerSocket(porta,100);
			telaServer.exibirMessagem("Servidor Executando com Sucesso\n");

		} catch (IOException ex) {
			Logger.getLogger(ProgramServer.class.getName()).log(Level.SEVERE, null, ex);
		}

		arquivoClientes = new File("clientes.bin");
		try {
			clientesInput = new ObjectInputStream(new FileInputStream(arquivoClientes));
			bancoDeClientes = (BancoDeClientes) clientesInput.readObject();
			clientesInput.close();
			telaServer.exibirMessagem("Lendo usuários cadastrados:\n");
			telaServer.exibirMessagem("   "+"NOME:SENHA\n");
			for(Cliente cliente:bancoDeClientes){
				telaServer.exibirMessagem("   "+cliente.getEmail()+":"+cliente.getSenha()+"\n");
			}
			telaServer.exibirMessagem("\n");
		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		}

		arquivoCompromissos = new File("compromissos.bin");
		try {
			compromissosInput = new ObjectInputStream(new FileInputStream(arquivoCompromissos));
			bancoDeCompromissos = (BancoDeCompromissos) compromissosInput.readObject();
			compromissosInput.close();
			telaServer.exibirMessagem("Lendo compromissos cadastrados:\n");
			telaServer.exibirMessagem("   "+"TITULO:DATA:HORA\n");
			for(Event compromisso:bancoDeCompromissos){
				telaServer.exibirMessagem("   "+compromisso.getTitle()+":"+
						compromisso.getDayOfMonth()+"/"+compromisso.getMonth()+"/"+compromisso.getYear()+":"+
						compromisso.getHour()+":"+compromisso.getMinute()+"\n");
			}
			telaServer.exibirMessagem("\n");
		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		}

		while (true) {
			telaServer.exibirMessagem("Servidor esperando conexão...\n");
			try {
				esperaConexao();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	public void esperaConexao() throws IOException {

		conexao = servidor.accept();
		conexao.getInetAddress().getHostName();

		telaServer.exibirMessagem("Conexão estabelecida com o cliente:\n");

		//Cria uma nova Thread para tratar esse conexão
		TrataCliente thr = new TrataCliente(conexao);
		telaServer.exibirMessagem(conexao.toString()+"\n\n");
		Thread t = new Thread(thr);
		t.start();

	}

	public static BancoDeClientes getBancoDeClientes() {
		return bancoDeClientes;
	}

	public static void setBancoDeClientes(BancoDeClientes bancoDeClientes) {
		ProgramServer.bancoDeClientes = bancoDeClientes;
	}

	public static BancoDeCompromissos getBancoDeCompromissos() {
		return bancoDeCompromissos;
	}

	public static void setBancoDeCompromissos(
			BancoDeCompromissos bancoDeCompromissos) {
		ProgramServer.bancoDeCompromissos = new BancoDeCompromissos(bancoDeCompromissos);
	}
        
        public static int getNumSalasChat() {
            
		return salas_Chat;
	}

	public static void setNumSalasChat(int NumSalaChat) {
		ProgramServer.salas_Chat = NumSalaChat;
	}
        
        public static int getNumSalasVideo() {
		return salas_Video;
	}

	public static void setNumSalasVideo(int NumSalaVideo) {
		ProgramServer.salas_Video = NumSalaVideo;
	}
        
        public static int getNumTelaEmoticon() {
		return tela_Emoticon;
	}

	public static void setNumTelaEmoticon(int NumTelaEmoticon) {
		ProgramServer.tela_Emoticon = NumTelaEmoticon;
	}
        
        public static ArrayList getDonosSalaChat() {
		return donos_SalaChat;
	}

	public static void addDonosSalaChat(Cliente dono) {
		ProgramServer.donos_SalaChat.add(dono);
	}
        public static void removeDonosSalaChat(Cliente dono) {
		ProgramServer.donos_SalaChat.remove(dono);
	}
}

